﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace CityGames
{
    public partial class FormEventosAltaTorneo : Form
    {
        private FormContenedor contenedor;

        private string expRetbCaracteres = @"^\S.+$";
        private string expRetbPrecio = @"^[0-9]+([,][0-9]{1,2})?$";

        private ErrorProvider errorProviderNombre;
        private ErrorProvider errorProviderJuego;
        private ErrorProvider errorProviderPrecio;
        private ErrorProvider errorProviderFecha;
        private ErrorProvider errorProviderPremio1;

        private Juego enJuego; 
        private Torneo enTorneo;

        DataSet datosTorneo;
        private DataSet dsPremios;

        private string nombreTorneoOriginal;
        private string estadoTorneoOriginal;
        private string gruposTorneoOriginal;
        private int numeroParticipantesTorneoOriginal;
        private DateTime fechaTorneoOriginal;

        private string estado; // Estados: "Nuevo", "Visualizar", "Modificar"

        public FormEventosAltaTorneo()
        {
            InitializeComponent();
        }

        private void FormEventosAltaTorneo_Load(object sender, EventArgs e)
        {
            try
            {
                contenedor = (FormContenedor)MdiParent;

                enTorneo = new Torneo();
                enJuego = new Juego();

                datosTorneo = new DataSet();
                dsPremios = new DataSet();

                estado = "Nuevo";
                nombreTorneoOriginal = "";
                estadoTorneoOriginal = "Inscripciones";
                gruposTorneoOriginal = "No";
                numeroParticipantesTorneoOriginal = 8;
                fechaTorneoOriginal = new DateTime();

                tbJuego.AutoCompleteCustomSource = enJuego.ObtenerTodosLosJuegosParaAutocompletado();
                tbJuego.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                tbJuego.AutoCompleteSource = AutoCompleteSource.CustomSource;

                cbMaxPart.SelectedItem = cbMaxPart.Items[0];

                errorProviderNombre = new ErrorProvider();
                errorProviderNombre.SetIconAlignment(tbNombre, ErrorIconAlignment.MiddleRight);
                errorProviderNombre.SetIconPadding(tbNombre, 2);
                errorProviderNombre.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                errorProviderJuego = new ErrorProvider();
                errorProviderJuego.SetIconAlignment(tbJuego, ErrorIconAlignment.MiddleRight);
                errorProviderJuego.SetIconPadding(tbJuego, 2);
                errorProviderJuego.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                errorProviderPrecio = new ErrorProvider();
                errorProviderPrecio.SetIconAlignment(tbPrecio, ErrorIconAlignment.MiddleRight);
                errorProviderPrecio.SetIconPadding(tbPrecio, 16);
                errorProviderPrecio.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                errorProviderFecha = new ErrorProvider();
                errorProviderFecha.SetIconAlignment(dtpFechaInicio, ErrorIconAlignment.MiddleRight);
                errorProviderFecha.SetIconPadding(dtpFechaInicio, 2);
                errorProviderFecha.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                errorProviderPremio1 = new ErrorProvider();
                errorProviderPremio1.SetIconAlignment(tbPremio1, ErrorIconAlignment.MiddleRight);
                errorProviderPremio1.SetIconPadding(tbPremio1, 2);
                errorProviderPremio1.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FormEventosAltaTorneo_Activated(object sender, EventArgs e)
        {
            try
            {
                bool visualizar = (estado == "Visualizar");

                tbNombre.Enabled = !visualizar;
                tbJuego.Enabled = !visualizar;
                dtpFechaInicio.Enabled = !visualizar;

                if (estado == "Visualizar" || (estado == "Modificar" && estadoTorneoOriginal != "Inscripciones"))
                {
                    rbEliminatorias.Enabled = false;
                    rbGrupos.Enabled = false;
                    cbMaxPart.Enabled = false;
                }
                else
                {
                    rbEliminatorias.Enabled = true;
                    rbGrupos.Enabled = true;
                    cbMaxPart.Enabled = true;
                }

                tbPrecio.Enabled = !visualizar;
                tbNotas.Enabled = !visualizar;
                tbPremio1.Enabled = !visualizar;
                tbPremio2.Enabled = !visualizar;
                tbPremio3.Enabled = !visualizar;
                tbPremio4.Enabled = !visualizar;
                btGuardar.Enabled = !visualizar;
                btLimpiar.Enabled = !visualizar;

                EliminarErrorProvider();

                if (estado == "Visualizar")
                {
                    lblTitulo.Text = "Visualizar Torneo";
                    btCancelar.Text = "Volver a Gestion";
                    btCancelar.Width = 130;
                    btLimpiar.Text = "Limpiar";

                    if (estadoTorneoOriginal == "Inscripciones")
                        bIrAGrupos.Enabled = !visualizar;
                    else
                        bIrAGrupos.Enabled = visualizar;

                    bIrAGrupos.Visible = true;

                    if (gruposTorneoOriginal == "Si")
                    {
                        Point posicion = new Point(792, 526);
                        bIrAGrupos.Text = "Grupos >>";
                        bIrAGrupos.Width = 96;
                        bIrAGrupos.Location = posicion;
                    }
                    else
                    {
                        Point posicion = new Point(764, 526);
                        bIrAGrupos.Text = "Eliminatorias >>";
                        bIrAGrupos.Width = 124;
                        bIrAGrupos.Location = posicion;
                    }
                }
                else if (estado == "Modificar")
                {
                    lblTitulo.Text = "Editar Torneo";
                    btCancelar.Text = "Volver a Gestion";
                    btCancelar.Width = 130;
                    btLimpiar.Text = "Restablecer";
                    bIrAGrupos.Enabled = false;
                    bIrAGrupos.Visible = false;
                }
                else if (estado == "Nuevo")
                {
                    lblTitulo.Text = "Nuevo Torneo";
                    btCancelar.Text = "Cancelar";
                    btCancelar.Width = 96;
                    btLimpiar.Text = "Limpiar";
                    bIrAGrupos.Enabled = false;
                    bIrAGrupos.Visible = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (estado == "Nuevo")
                {
                    if (ValidarCampos())
                    {
                        enTorneo.AltaTorneo();
                        MessageBox.Show("Torneo insertado correctamente.   ", "Correcto", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        enTorneo = new Torneo();
                    }
                }
                else if (estado == "Modificar")
                {
                    if (ValidarCampos())
                    {
                        enTorneo.ActualizarTorneo(nombreTorneoOriginal);
                        
                        if (enTorneo.Grupos == "Si")
                        {
                            if (gruposTorneoOriginal == "No") // Hay que crear los grupos
                            {
                                if (enTorneo.NumeroParticipantes == 12) // Hay que crear 2 grupos: A y B
                                {
                                    enTorneo.CrearGruposABDeTorneo();
                                }
                                else // Hay que crear 4 grupos: A, B, C y D
                                {
                                    enTorneo.CrearGruposABDeTorneo();
                                    enTorneo.CrearGruposCDDeTorneo();
                                }
                            }
                            else // Comprobamos si ha variado el número de participantes
                            {
                                if (numeroParticipantesTorneoOriginal != enTorneo.NumeroParticipantes)
                                {
                                    if (enTorneo.NumeroParticipantes == 12) // Antes habían 24 y ahora hay 12, hay que borrar 2 grupos: C y D
                                    {
                                        enTorneo.BorrarGruposDeTorneo();
                                        enTorneo.CrearGruposABDeTorneo();
                                    }
                                    else // Antes habían 12 y ahora hay 24, hay que crear 2 grupos: C y D
                                    {
                                        enTorneo.CrearGruposCDDeTorneo();
                                    }
                                }
                            }
                        }
                        else if (gruposTorneoOriginal == "Si") // Antes habían grupos y ahora no, hay que borrarlos
                        {
                            enTorneo.BorrarGruposDeTorneo();
                        }

                        MessageBox.Show("Torneo actualizado correctamente.   ", "Correcto", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        enTorneo = new Torneo();
                        contenedor.hijoFormEventosGestion.CargarDataGridViewEventos();
                        contenedor.hijoFormEventosGestion.Focus();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private bool ValidarCampos()
        {
            bool ok = true;

            try
            {
                EliminarErrorProvider();

                string nombre = tbNombre.Text;
                string juego = tbJuego.Text;
                string numeroParticipantes = cbMaxPart.Text;
                DateTime fechaInicio = dtpFechaInicio.Value;
                string precio = tbPrecio.Text;
                string notas = tbNotas.Text;

                bool eliminatorias = rbEliminatorias.Checked;
                bool grupos = rbGrupos.Checked;

                string premio1 = tbPremio1.Text;
                string premio2 = tbPremio2.Text;
                string premio3 = tbPremio3.Text;
                string premio4 = tbPremio4.Text;

                string errores = "Se han encontrado los siguientes errores:\n\n";


                if (tbNombre.Text != "")
                {
                    if (estado == "Nuevo" || (estado == "Modificar" && tbNombre.Text != nombreTorneoOriginal))
                    {
                        if (!enTorneo.ExisteTorneo(nombre))
                        {
                            enTorneo.Nombre = nombre;
                            errorProviderNombre.SetError(tbNombre, null);
                        }
                        else
                        {
                            errorProviderNombre.SetError(tbNombre, "Ese Torneo ya existe");

                            errores += "- Ese Torneo ya existe\n";
                            ok = false;
                        }
                    }
                    else
                    {
                        enTorneo.Nombre = nombre;
                        errorProviderNombre.SetError(tbNombre, null);
                    }
                }
                else
                {
                    errorProviderNombre.SetError(tbNombre, "Debe introducir un nombre para el torneo");

                    errores += "- Debe introducir un nombre para el torneo\n";
                    ok = false;
                }

                /*busco la pos donde empieza la plataforma para substraer solo el nombre*/
                int j = 0;
                bool sw = false;
                int tam = (juego.Length) - 1;
                int i = tam;
                while ((i >= 0) && (sw == false))
                {
                    if (juego[i] == ' ')
                    {
                        sw = true;
                        j = i - 3;
                    }
                    else
                        i--;
                }

                if (tbJuego.Text != "")
                {
                    string nombreJuegoVerificar = juego.Substring(0, j + 1); // verificar si pilla el nombre correctamente
                    string plataforma = juego.Substring(i + 1, tam - i);

                    if (enJuego.ExisteJuego(nombreJuegoVerificar, plataforma))
                    {
                        enTorneo.Juego.Plataforma = plataforma;
                        enTorneo.Juego.Nombre = nombreJuegoVerificar;
                        errorProviderJuego.SetError(tbJuego, null);
                    }
                    else
                    {
                        errorProviderJuego.SetError(tbJuego, "El juego no existe");

                        errores += "- El juego no existe\n";
                        ok = false;
                    }
                }
                else
                {
                    errorProviderJuego.SetError(tbJuego, "Debe seleccionar un juego");

                    errores += "- Debe seleccionar un juego\n";
                    ok = false;
                }

                enTorneo.NumeroParticipantes = int.Parse(numeroParticipantes);

                if (estado == "Nuevo" || (estado == "Modificar" && fechaInicio != fechaTorneoOriginal))
                {
                    if ((DateTime.Compare(fechaInicio, DateTime.Today) >= 0)) // Si es igual o mayor a la fecha actal
                    {
                        enTorneo.FechaInicio = fechaInicio;
                        errorProviderFecha.SetError(dtpFechaInicio, null);
                    }
                    else
                    {
                        errorProviderFecha.SetError(dtpFechaInicio, "La fecha de inicio no puede ser anterior a la actual");

                        errores += "- La fecha de inicio no puede ser anterior a la actual\n";
                        ok = false;
                    }
                }
                else
                {
                    enTorneo.FechaInicio = fechaInicio;
                    errorProviderFecha.SetError(dtpFechaInicio, null);
                }

                if (Regex.Match(precio, expRetbPrecio).Success)
                {
                    enTorneo.Precio = decimal.Parse(precio);
                    errorProviderPrecio.SetError(tbPrecio, null);
                }
                else
                {
                    errorProviderPrecio.SetError(tbPrecio, "Debe introducir un precio con formato: 15,75");

                    errores += "- Debe introducir un precio con formato: 15,75\n";
                    ok = false;
                }

                enTorneo.Notas = notas;

                if (rbEliminatorias.Checked)
                    enTorneo.Grupos = "No";
                if (rbGrupos.Checked)
                    enTorneo.Grupos = "Si";

                if (estado == "Nuevo")
                    enTorneo.Estado = "Inscripciones";
                else
                    enTorneo.Estado = estadoTorneoOriginal;

                if (Regex.Match(premio1, expRetbCaracteres).Success)
                {
                    enTorneo.Premio1.NombreEvento = nombre;
                    enTorneo.Premio1.Posicion = 1;
                    enTorneo.Premio1.Descripcion = premio1;
                    enTorneo.Premio1.DniSocio = "";
                    errorProviderPremio1.SetError(tbPremio1, null);
                }
                else
                {
                    errorProviderPremio1.SetError(tbPremio1, "Introduce un premio con formato correcto.");

                    errores += "- Debe introducir al menos un premio\n";
                    ok = false;
                }

                enTorneo.Premio2.NombreEvento = nombre;
                enTorneo.Premio2.Posicion = 2;
                enTorneo.Premio2.Descripcion = premio2;
                enTorneo.Premio2.DniSocio = "";

                enTorneo.Premio3.NombreEvento = nombre;
                enTorneo.Premio3.Posicion = 3;
                enTorneo.Premio3.Descripcion = premio3;
                enTorneo.Premio3.DniSocio = "";

                enTorneo.Premio4.NombreEvento = nombre;
                enTorneo.Premio4.Posicion = 4;
                enTorneo.Premio4.Descripcion = premio4;
                enTorneo.Premio4.DniSocio = "";

                if (!ok)
                {
                    MessageBox.Show(errores, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    if (errorProviderNombre.GetError(tbNombre) != "")
                        tbNombre.Focus();
                    else if (errorProviderJuego.GetError(tbJuego) != "")
                        tbJuego.Focus();
                    else if (errorProviderFecha.GetError(dtpFechaInicio) != "")
                        dtpFechaInicio.Focus();
                    else if (errorProviderPrecio.GetError(tbPrecio) != "")
                        tbPrecio.Focus();
                    else if (errorProviderPremio1.GetError(tbPremio1) != "")
                        tbPremio1.Focus();
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return ok;
        }

        private void btLimpiar_Click(object sender, EventArgs e)
        {
            try
            {
                if (estado == "Nuevo")
                    Limpiar();
                else if (estado == "Modificar")
                    RellenarDatos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void Limpiar()
        {
            try
            {
                Juego enJuego = new Juego();
                tbJuego.AutoCompleteCustomSource = enJuego.ObtenerTodosLosJuegosParaAutocompletado();
                tbJuego.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                tbJuego.AutoCompleteSource = AutoCompleteSource.CustomSource;

                tbNombre.Text = "";
                tbJuego.Text = "";
                dtpFechaInicio.Value = DateTime.Now;
                cbMaxPart.SelectedItem = cbMaxPart.Items[0];
                tbPrecio.Text = "";
                rbEliminatorias.Checked = true;
                rbGrupos.Checked = false;
                tbNotas.Text = "";
                tbPremio1.Text = "";
                tbPremio2.Text = "";
                tbPremio3.Text = "";
                tbPremio4.Text = "";

                EliminarErrorProvider();

                tbNombre.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                if (estado == "Nuevo")
                    contenedor.hijoFormMenuPrincipal.Focus();
                else if (estado == "Modificar" || estado == "Visualizar")
                    contenedor.hijoFormEventosGestion.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void EliminarErrorProvider()
        {
            try
            {
                errorProviderNombre.SetError(tbNombre, null);
                errorProviderPrecio.SetError(tbPrecio, null);
                errorProviderJuego.SetError(tbJuego, null);
                errorProviderFecha.SetError(dtpFechaInicio, null);
                errorProviderPremio1.SetError(tbPremio1, null);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void NuevoTorneo(object sender, EventArgs e)
        {
            try
            {
                estado = "Nuevo";
                Limpiar();
                FormEventosAltaTorneo_Activated(sender, e);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public bool VisualizarTorneo(string nombreTorneo)
        {
            bool resultado = false;

            try
            {
                estado = "Visualizar";
                nombreTorneoOriginal = nombreTorneo;
                resultado = RellenarDatos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return resultado;
        }

        public bool ModificarTorneo(string nombreTorneo)
        {
            bool resultado = false;

            try
            {
                estado = "Modificar";
                nombreTorneoOriginal = nombreTorneo;
                resultado = RellenarDatos();
                tbNombre.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return resultado;
        }

        public bool RellenarDatos()
        {
            bool resultado = false;

            try
            {
                datosTorneo = enTorneo.ObtenerDatosDeTorneo(nombreTorneoOriginal);
                dsPremios = enTorneo.ObtenerPremiosDeTorneo(nombreTorneoOriginal);

                if (datosTorneo.Tables["DatosTorneo"].Rows.Count > 0 && dsPremios.Tables["PremiosTorneo"].Rows.Count > 0)
                {
                    estadoTorneoOriginal = datosTorneo.Tables["DatosTorneo"].Rows[0]["Estado"].ToString();
                    gruposTorneoOriginal = datosTorneo.Tables["DatosTorneo"].Rows[0]["Grupos"].ToString();
                    numeroParticipantesTorneoOriginal = int.Parse(datosTorneo.Tables["DatosTorneo"].Rows[0]["NumeroParticipantes"].ToString());
                    fechaTorneoOriginal = DateTime.Parse(datosTorneo.Tables["DatosTorneo"].Rows[0]["FechaInicio"].ToString());

                    tbNombre.Text = datosTorneo.Tables["DatosTorneo"].Rows[0]["Nombre"].ToString();
                    tbJuego.Text = datosTorneo.Tables["DatosTorneo"].Rows[0]["NombreJuego"].ToString() + " - " + datosTorneo.Tables["DatosTorneo"].Rows[0]["PlataformaJuego"].ToString();
                    dtpFechaInicio.Value = DateTime.Parse(datosTorneo.Tables["DatosTorneo"].Rows[0]["FechaInicio"].ToString());
                    if (datosTorneo.Tables["DatosTorneo"].Rows[0]["Grupos"].ToString() == "Si")
                        rbGrupos.Checked = true;
                    else
                        rbEliminatorias.Checked = true;
                    cbMaxPart.Text = datosTorneo.Tables["DatosTorneo"].Rows[0]["NumeroParticipantes"].ToString();
                    tbPrecio.Text = datosTorneo.Tables["DatosTorneo"].Rows[0]["Precio"].ToString();
                    tbNotas.Text = datosTorneo.Tables["DatosTorneo"].Rows[0]["Notas"].ToString();

                    tbPremio1.Text = dsPremios.Tables["PremiosTorneo"].Rows[0]["Descripcion"].ToString();
                    tbPremio2.Text = dsPremios.Tables["PremiosTorneo"].Rows[1]["Descripcion"].ToString();
                    tbPremio3.Text = dsPremios.Tables["PremiosTorneo"].Rows[2]["Descripcion"].ToString();
                    tbPremio4.Text = dsPremios.Tables["PremiosTorneo"].Rows[3]["Descripcion"].ToString();

                    resultado = true;
                }
                else
                {
                    MessageBox.Show("No se han podido cargar todos los datos del torneo.    ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return resultado;
        }

        private void rbEliminatorias_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                cbMaxPart.Items[0] = "8";
                cbMaxPart.Items[1] = "16";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void rbGrupos_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                cbMaxPart.Items[0] = "12";
                cbMaxPart.Items[1] = "24";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bIrAGrupos_Click(object sender, EventArgs e)
        {
            try
            {
                if (gruposTorneoOriginal == "Si")
                    contenedor.hijoFormEventosGruposT.Focus();
                else
                    contenedor.hijoFormEventosBracketsT.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se ha producido un error.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
